在練習表單處理這塊,如果在不依賴套件的狀況下,可以有兩種方式來控制表單欄位,那麼今天就來介紹一下controlled component 和uncontrolled component
兩者之間的最大的差異就在於component state是否由React控制
兩者都可以達到取值的目的
以下為一個簡單的登入表單
先用state存放帳號和密碼,然後透過將state的值賦予input,當用戶輸入資料的時候就會觸發onChange function ,呼叫setState來更新欄位資料,類似vue的 vue-model雙向綁定的概念
class FormExample extends Component{
constructor(){
super()
this.state = {
name:'',
password:''
}
}
login = () =>{
const {name, password} = this.state
console.log('name',name,'password',password)
}
render(){
const { name, password } = this.state
return(
<Fragment>
<ul>
<li>
<label>username</label>
<input
type = "text"
value = { name }
onChange = { (e) => this.setState({name: e.target.value})}
/>
</li>
<li>
<label>password</label>
<input
type = "password"
value = { password }
onChange={(e) => { this.setState({password: e.target.value})}}
/>
</li>
</ul>
<button onClick={this.login}>login</button>
</Fragment>
)
}
以下是用createRef來取得input本身,再利用current.value取的input的value 操作表單 ,跟傳統的document.getElementsByTagName("input")[0].value來取值的概念是一樣的
class FormRefExample extends Component{
constructor(){
super()
this.nameRef = createRef()
}
login = () =>{
console.log('value',this.nameRef.current.value)
}
render(){
return(
<Fragment>
<input type="text" ref={this.nameRef} />
<button onClick={this.login}>登入</button>
</Fragment>
)
}
}
看來看去 ,好像第二種寫法uncontrolled component更簡單不是嗎?但是當需要控制的DOM數量一多, 需要大量手動的去操作DOM作業量就變得更繁重, 而controlled component 是由資料數據來更動畫面,雖然一開始的資料綁定流程比較繁瑣,但綁定完畢之後只要專注在資料處理即可,所以儘可能地使用controlled component吧!